import router from "./router";
import store from "./store";
import { Message, MessageBox } from "element-ui";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { getToken, removeToken, setToken } from "@/utils/auth";
import { isRelogin } from "@/utils/request";
import { getTokens, getTokensByTicket } from "@/api/login";
import { c_id, c_secret, rUri } from "@/settings";

NProgress.configure({ showSpinner: false });
// let analyse = new Analyse({
//   id: "jx-portal", // 网站标识
//   version: "0.0.1", // 版本号
//   logUrl: "//" + "172.19.3.2:30203" + "/analyse.gif", // 记录地址
//   paramsSeparator: ".", // 请求参数键名称的分隔符
//   cookiePrefix: "jx_portal_", // 键值前缀
//   cookieDomain: "zhenghe.cn", // Cookie种植域名
//   cookieUseRoot: true, // 步长是否种植到根域名下
//   cookieStep: "step", // 步长的键名称
//   cookieUUID: "uuid", // 用户唯一标识
//   // cookieUUID: uId, // 用户唯一标识
//   // hashQuery: "", // 页面Hash参数
// });
// let ipAddr = "";
// // 获取ip https://ipinfo.io/json
// function getIp() {
//   fetch("https://ipinfo.io/json")
//     .then((response) => response.json())
//     .then((data) => {
//       ipAddr = data.ip;
//     });
// }
// getIp();

function uuid() {
  var d = new Date().getTime();
  var d2 = (performance && performance.now && performance.now() * 1000) || 0;
  return Array(32)
    .fill("x")
    .join("")
    .replace(/[xy]/g, function (c) {
      var r = Math.random() * 16;
      if (d > 0) {
        r = (d + r) % 16 | 0;
        d = Math.floor(d / 16);
      } else {
        r = (d2 + r) % 16 | 0;
        d2 = Math.floor(d2 / 16);
      }
      return (c === "x" ? r : (r & 0x3) | 0x8).toString(16);
    });
}
// 生成唯一id, 存入localStorage;
if (!localStorage.getItem("uuid")) {
  localStorage.setItem("uuid", uuid());
  //console.log(localStorage.getItem("uuid"), "0000");
}

const whiteList = [
  "/login",
  "/auth-redirect",
  "/bind",
  "/register",
  "/diaowen",
  "/index",
  "/appPage",
  "/workbench",
  "/mesPage",
  "/todoPage",
  "/noticePageDetail",
  "/noticePage",
  "/feedback",
  "/feedbackDetail",
  "/feedbackPublic",
  "/kxLogin",
  "/projectApplicationPage",
  "/publicizePage",
  "/publicizePageDetail",
  "/resetPwd",
  "/emailPwd",
  "/mobilePwd",
  "/techSupport",
  "/activeAccount",
  "/registerPage",
  "/changePwd",
  "/confirmEmail",
  "/guideSolicitationPage",
  "/helpPage",
];

function loginByTicket(callback) {
  // 获取地址栏url中的ticket
  let url = window.location.href;
  let ticket = url.match(/ticket=(\S*)&/);
  console.log("ticket", ticket);
  if (!ticket) {
    console.log("ticket不存在");
    callback();
    return;
  }
  let realTicket = ticket[1];
  console.log("ticket", realTicket);
  store.commit("SET_TOKEN", "");
  removeToken();
  getTokensByTicket({ ticket: realTicket })
    .then((res) => {
      if (res.code == 1) {
        let msg = res.obj;
        // 存入sessionStorage
        sessionStorage.setItem("msg", JSON.stringify(msg));
        callback();
      } else {
        setToken(res.obj.access_token);
        store.commit("SET_TOKEN", res.obj.access_token);

        // 网址中的ticket已经使用过了，清除掉
        window.location.href = window.location.href.split("?")[0];
        callback("/");
      }
    })
    .catch((err) => {
      console.log(err);
    });
}

function getTokenByCode(callback) {
  // 未登录时， 获取token,by code
  // 获取地址栏url
  let url = window.location.href;
  // 获取code
  // let code = url.split("?")[1].split("=")[1];
  // let realCode = code.split("#")[0];
  // 在url中匹配code=后面的值
  let code = url.match(/code=(\S*)#/);
  console.log("code", code);

  // 如果code不存在，跳转到登录页面
  if (!code) {
    // this.jumpToIndex();
    console.log("code不存在");
    callback();
    return;
  }
  let realCode = code[1];
  console.log("code", realCode);
  store.commit("SET_TOKEN", "");
  removeToken();
  let loginForm = {
    code: realCode,
    grant_type: "authorization_code",
    redirect_uri: rUri,
  };
  getTokens(loginForm)
    .then((res) => {
      setToken(res.obj.accessToken);

      // this.noLogin = false; // 已登录

      store.commit("SET_TOKEN", res.obj.accessToken);
      const curr = sessionStorage.getItem("currentRouter");

      if (curr) {
        window.location.href = window.location.href.split("?")[0] + "#" + curr;
      } else {
        window.location.href = window.location.href.split("?")[0];
      }
      // 网址中的code已经使用过了，清除掉
      // window.location.href = window.location.href.split("?")[0];
      // callback();
      // callback("/");
      // this.$router.push({ path: "/" });
      // 获取用户信息
      // this.getInfoDetail();
    })
    .catch((err) => {
      console.log(err);
      // this.noLogin = true; // 未登录
    });
}

function GetRequest() {
  var str = location.href;
  var num = str.indexOf("#");
  str = str.substr(num + 1);
  return str;
}

router.beforeEach((to, from, next) => {
  if (to.meta.title) {
    if (to.meta.pageTitle) {
      document.title = to.meta.title + " - " + to.meta.pageTitle;
    } else {
      // 如果是'首页',则显示 process.env.VUE_APP_TITLE
      if (to.meta.title == "首页") {
        document.title = process.env.VUE_APP_TITLE;
      } else {
        document.title = to.meta.title + " - " + process.env.VUE_APP_TITLE;
      }
    }
  }

  NProgress.start();
  if (getToken()) {
    to.meta.title && store.dispatch("settings/setTitle", to.meta.title);
    /* has token*/
    if (to.path === "/login") {
      next({ path: "/" });
      NProgress.done();
    } else {
      if (store.getters.roles.length === 0) {
        isRelogin.show = true;
        // 判断当前用户是否已拉取完user_info信息
        store
          .dispatch("GetInfo")
          .then(() => {
            // store.dispatch("getComponent", GetRequest());
            isRelogin.show = false;
            store.dispatch("GenerateRoutes").then((accessRoutes) => {
              // 根据roles权限生成可访问的路由表
              router.addRoutes(accessRoutes); // 动态添加可访问路由表
              next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
            });
          })
          .catch((err) => {
            store.dispatch("FedLogOut").then(() => {
              // Message.error(err); //注释掉解决登录页报错
              next({ path: "/" });
            });
          });
      } else {
        next();
      }
    }
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单，直接进入
      // next();
      // 如果路径是kxLogin,是从kx登录过来的，需要获取token
      if (to.path == "/kxLogin") {
        loginByTicket(next);
      } else {
        getTokenByCode(next);
      }
    } else if (to.name == "DwAnswer") {
      // 调查问卷 简短地址 特殊处理
      next();
    } else {
      // next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
      // window.location.href = `${login_url}&client_id=${c_id}&client_secret=${c_secret}&redirect_uri=${redirect_uri}`;
      // debugger;
      // window.open(
      //   `${process.env.VUE_APP_LOGIN_URL}/api-uaa/v1/oauth/authorize?response_type=code&client_id=${c_id}&client_secret=${c_secret}&redirect_uri=${rUri}`,
      //   "_self"
      // );
      // 如果参数中有token,则直接登录
      let url = window.location.href;
      let token = url.match(/token=(\S*)/);

      if (token) {
        let realToken = token[1];
        console.log("token", realToken);
        setToken(realToken);
        store.commit("SET_TOKEN", realToken);
        next();
      } else {
        if (url.indexOf("#/index") === -1) {
          MessageBox.confirm(
            "登录状态已过期，您可以继续留在该页面，或者重新登录",
            "系统提示",
            {
              confirmButtonText: "重新登录",
              cancelButtonText: "取消",
              type: "warning",
            }
          ).then(() => {
            // store.dispatch("LogOut").then(() => {
            //   location.reload(); // 为了重新实例化vue-router对象 避免bug
            // });
            // 去登录
            window.open(
              `${process.env.VUE_APP_LOGIN_URL}/api-uaa/v1/oauth/authorize?response_type=code&client_id=${c_id}&client_secret=${c_secret}&redirect_uri=${rUri}`,
              "_self"
            );
          });
        }
      }

      NProgress.done();
    }
  }
});

// router.afterEach(() => {
//   NProgress.done();
// });
let pageName = [];
// 路由监听
router.afterEach((to, from) => {
  document.getElementById("app").scrollTo(0, 0);

  NProgress.done();

  // console.log("city", city);
  // if (to) {
  //   // 清空界面名
  //   pageName = [];
  //   // 离开界面
  //   from.matched.forEach((item) => {
  //     pageName.push(item.meta.title);
  //   });

  //   if (pageName.length > 0) {
  //     // analyse.send("page", "leave", {
  //     //   ps: pageName.join("-"),
  //     // });
  //     if (getToken()) {
  //       // console.log("res", res);

  //       let uId = store.getters.userInfo.baseId || "unlogin";
  //       // 用户行为分析
  //       window.FA.send("page", "leave", {
  //         // tp: "pv",
  //         // ac: "pv",
  //         // ps: pageName.join("-"),
  //         ps: from.meta.title,
  //         uid: uId,
  //       });
  //     } else {
  //       let uId = localStorage.getItem("uuid") || "unlogin";
  //       // 用户行为分析
  //       window.FA.send("page", "leave", {
  //         // ps: pageName.join("-"),
  //         ps: from.meta.title,
  //         uid: uId,
  //       });
  //     }
  //   }
  //   pageName = [];
  // }
  // if (from) {
  //   // 进入界面
  //   to.matched.forEach((item) => {
  //     pageName.push(item.meta.title);
  //   });
  //   if (pageName.length > 0) {
  //     // analyse.send("page", "enter", {
  //     //   ps: pageName.join("-"),
  //     // });
  //     if (getToken()) {
  //       // console.log("res", res);
  //       let uId = store.getters.userInfo.baseId || "unlogin";

  //       // 用户行为分析
  //       window.FA.send("page", "init", {
  //         // tp: "pv",
  //         // ac: "pv",
  //         // ps: pageName.join("-"),
  //         ps: to.meta.title, // 页面名称(菜单名称)
  //         uid: uId, // 用户id
  //         appName: "统一门户", // 系统名称
  //         appId: c_id, // 应用id
  //         // ip: ipAddr, // ip地址
  //         // userName: store.getters.userInfo.realname, // 用户名称（登录账号）
  //         userName: store.getters.userInfo.username, // 用户名称
  //         realName: store.getters.userInfo.realname, // 用户名称(realname)
  //         time: new Date().toLocaleString("zh-CN", { hour12: false }), // 点击功能时间 （yyyy-MM-dd HH:mm:ss）
  //         roleType: store.getters.userInfo.role, // 用户类型（0 个人 1 企业 2 政府）
  //         role: store.getters.userInfo.sysRoleList // 用户角色
  //           .map((item) => item.baseName)
  //           .join(","),
  //       });
  //     } else {
  //       let uId = localStorage.getItem("uuid") || "unlogin";
  //       // 用户行为分析
  //       window.FA.send("page", "init", {
  //         ps: to.meta.title,
  //         uid: uId,
  //         time: new Date().toLocaleString("zh-CN", { hour12: false }), // 点击功能时间 （yyyy-MM-dd HH:mm:ss）
  //         appName: "统一门户", // 应用名称
  //         appId: c_id, // 应用id
  //       });
  //     }
  //   }
  // }
  // if (getToken()) {
  //   getUserInfo().then((res) => {
  //     // console.log("res", res);
  //     let uId = res?.obj?.baseId || "unlogin";
  //     // 用户行为分析
  //     analyse.send({
  //       // tp: "pv",
  //       // ac: "pv",
  //       ps: to.meta.title,
  //       uid: uId,
  //     });
  //   });
  // } else {
  //   let uId = localStorage.getItem("uuid") || "unlogin";
  //   // 用户行为分析
  //   analyse.send("page", "init", {
  //     ps: to.meta.title,
  //     uid: uId,
  //   });
  // }
});
